/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package WebServices;

/**
 *
 * @author Usuario
 */

import DataTypes.DataEvento;
import DataTypes.DataGrupo;
import DataTypes.DataRol;
import Hndlr.HndlrGrupo;
import Interfaces.Factory;
import Interfaces.ICrearGrupo;
import enums.EnumAprob;
import enums.enumRol;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Logger;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.Endpoint;
import objetos.Contenido;
import objetos.Grupo;
import objetos.Rol;

import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;

@WebService
@SOAPBinding(style = Style.RPC, parameterStyle = ParameterStyle.WRAPPED)


public class CtrlDetalleDeGrupoWS{

    private Endpoint endpoint = null;
    private Logger log = Logger.getLogger(CtrlDetalleDeGrupoWS.class.getName());

    
    @WebMethod(exclude = true)
    public void publicar() {
        Propiedades propiedades = Propiedades.getInstance();
        String nomCtrl = "CtrlDetalleGrupo";
        String camino = "http://" + propiedades.getServer() + ":" + propiedades.getPuerto() + "/" + nomCtrl;
        log.info("publicando el endpoint "+nomCtrl);
        endpoint = Endpoint.publish(camino, this);
        log.info("Endpoint "+nomCtrl+" publicado en " + camino);
    }
    
       @WebMethod(exclude = true)
    public Endpoint getEndpoint() {
        return endpoint;
    }
    
   @WebMethod
    public DataGrupo detallarGrupo(@WebParam(name = "clave")String clave) {
        HndlrGrupo hGrupo = HndlrGrupo.getInstance();
        Grupo gru = hGrupo.obtenerGrupo(clave);
        DataGrupo grupo = new DataGrupo(gru.getNombre(), gru.getDesc(), gru.getCantParticipantes(), gru.getImg(), gru.getFechaCreacion(), gru.getMuro().getDataMuro(), gru.getDataEventos(), gru.getRoles());
        return grupo;
    }

    @WebMethod
   public DataGrupo[] listarGrupos() {
        
        ICrearGrupo ctrlGrupo = Factory.getInstance().getCrearGrupos();
        ArrayList<DataGrupo> listG = ctrlGrupo.listarGrupos();
        Iterator<DataGrupo> it = listG.iterator();
        int tamanio = listG.size();
        DataGrupo [] datG = new DataGrupo[tamanio];
        int i = 0 ;
        while(it.hasNext()){
            
            datG[i] = it.next();
            i++;
        }
        return datG;
    }
    @WebMethod
    public DataRol[] listarRolUsuariosGrupo(@WebParam(name = "nomGrupo")String nomGrupo) {

        HndlrGrupo hGrupo = HndlrGrupo.getInstance();
        ArrayList<Rol> usr = hGrupo.obtenerGrupo(nomGrupo).getUsr();
        
        Iterator<Rol> itera = hGrupo.obtenerGrupo(nomGrupo).getUsr().iterator();
        int tam = usr.size();
        DataRol[] lista = new DataRol[tam];
       int i = 0;
        while (itera.hasNext()) {
            
            Rol rol = itera.next();
            DataRol drol = new DataRol(rol.getUsr().getDusuario(),rol.getRolUsr());
            lista[i] = drol;
            i++;
        }

        return lista;
    }

    @WebMethod
    public DataEvento[] listarCalendarioEventos(@WebParam(name = "nomGrupo")String nomGrup) {

        HndlrGrupo hGrupo = HndlrGrupo.getInstance();
        HashMap<String, DataEvento> listEve = hGrupo.listarCalendarioEventos(nomGrup);
        int tam = listEve.size();
        DataEvento[] datE = new DataEvento[tam];
        Iterator <DataEvento>it = listEve.values().iterator();
        int i = 0;
        while(it.hasNext()){
            
            datE[i] = it.next();
            i++;
        }
        
        return  datE;
    }

    @WebMethod
    public boolean esUsrModeradorGrupo(@WebParam(name = "grupo")String grupo,@WebParam(name = "mailUsr") String mailUsr) {
        if (!HndlrGrupo.getInstance().PerteneceMiembroAgrupo(mailUsr, grupo)) {
            return false;
        } else {
            return (HndlrGrupo.getInstance().obtenerGrupo(grupo).obtenerRol(mailUsr).getRolUsr() == enumRol.MODERADOR);
        }
    }

    @WebMethod
    public boolean esUsrCreadorGrupo(@WebParam(name = "grupo")String grupo, @WebParam(name = "mailUsr")String mailUsr) {
        if (!HndlrGrupo.getInstance().PerteneceMiembroAgrupo(mailUsr, grupo)) {
            return false;
        } else {
            return (HndlrGrupo.getInstance().obtenerGrupo(grupo).obtenerRol(mailUsr).getRolUsr() == enumRol.CREADOR);
        }
    }

    @WebMethod
    public void bloquearContenido(@WebParam(name = "grupo")String grupo,@WebParam(name = "tituloCont") String tituloCont) {
        ArrayList<Contenido> listCont = null;
        boolean seEncontro = false;

        listCont = HndlrGrupo.getInstance().obtenerGrupo(grupo).getMuro().getContenidosObjeto();

        Iterator<Contenido> itera = listCont.iterator();
        Contenido cont = null;
        while (itera.hasNext() && !seEncontro) {
            cont = itera.next();
            if (cont.getTitulo().equals(tituloCont)) {
                cont.setBloqueado(true);
                seEncontro = true;
            }
        }
    }

    @WebMethod
    public void aprobarContenido(@WebParam(name = "grupo")String grupo,@WebParam(name = "tituloCont") String tituloCont, @WebParam(name = "aprobar")boolean aprobar) {
        ArrayList<Contenido> listCont = null;
        boolean seEncontro = false;

        listCont = HndlrGrupo.getInstance().obtenerGrupo(grupo).getMuro().getContenidosObjeto();

        Iterator<Contenido> itera = listCont.iterator();
        Contenido cont = null;
        while (itera.hasNext() && !seEncontro) {
            cont = itera.next();
            if (cont.getTitulo().equals(tituloCont)) {
                if (aprobar) {
                    cont.setAprobacion(EnumAprob.APROBADO);
                    cont.setPublicar(false); //Usuario debe publicar contenido.
                } else {
                    cont.setAprobacion(EnumAprob.NO_APROBADO);
                }
                seEncontro = true;
            }
        }
    }

    @WebMethod
    public void publicarContenido(@WebParam(name = "grupo")String grupo,@WebParam(name = "tituloCont") String tituloCont) {
        ArrayList<Contenido> listCont = null;
        boolean seEncontro = false;

        listCont = HndlrGrupo.getInstance().obtenerGrupo(grupo).getMuro().getContenidosObjeto();

        Iterator<Contenido> itera = listCont.iterator();
        Contenido cont = null;
        while (itera.hasNext() && !seEncontro) {
            cont = itera.next();
            if (cont.getTitulo().equals(tituloCont)) {
                cont.setPublicar(true);
                seEncontro = true;
            }
        }
    }

    @WebMethod
    public String rolUsrGrupo(@WebParam(name = "grupo")String grupo,@WebParam(name = "correoUsr") String correoUsr) {
        DataGrupo dg = detallarGrupo(grupo);
        Iterator<String> itera = null;
        boolean seEncontro = false;
        String result = null;

        if (dg.getCreador().equals(correoUsr)) {
            seEncontro = true;
            result = "CREADOR";
        }
        if (!seEncontro) {
            itera = dg.getModeradores().iterator();
            while (itera.hasNext() && !seEncontro) {
                if (itera.next().equals(correoUsr)) {
                    seEncontro = true;
                    result = "MODERADOR";
                }
            }
        }
        if (!seEncontro) {
            itera = dg.getParticipantes().iterator();
            while (itera.hasNext() && !seEncontro) {
                if (itera.next().equals(correoUsr)) {
                    seEncontro = true;
                    result = "PARTICIPANTE";
                }
            }
        }
        if (!seEncontro) {
            result = "NO PERTENECE";
        }

        return result;

    }
}
